package org.dromara.common.translation.core.handler;

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;

import java.util.List;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：Bean 序列化修改器 解决 Null 被单独处理问题
 */
/**
 * TranslationBeanSerializerModifier类继承自BeanSerializerModifier，用于自定义序列化行为
 * 它的主要目的是在序列化过程中处理特定类型的对象时，应用一些特定的规则或转换
 * 例如，它可能会修改对象中的某些字段值的序列化方式，以满足特定的需求
 * 这个类的存在使得我们可以在不修改原始类定义的情况下，对序列化过程进行细粒度的控制
 */
public class TranslationBeanSerializerModifier extends BeanSerializerModifier {

    /**
     * 自定义属性列表处理器，用于处理在序列化过程中属性的特殊处理
     *
     * @param config 序列化配置对象，用于控制序列化行为
     * @param beanDesc 描述当前处理的JavaBean的信息
     * @param beanProperties 原始的Bean属性列表，包含所有待序列化的属性信息
     * @return 处理后的Bean属性列表
     *
     * 此方法的目的是为了在序列化过程中，对特定属性的空值进行特别处理
     * 通过遍历属性列表，检查每个属性的序列化器是否为 TranslationHandler 类型
     * 如果是，则让该属性的空值序列化也由 TranslationHandler 处理
     */
    @Override
    public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,
                                                     List<BeanPropertyWriter> beanProperties) {
        for (BeanPropertyWriter writer : beanProperties) {
            // 如果序列化器为 TranslationHandler 的话 将 Null 值也交给他处理
            // 检查当前属性的序列化器是否为 TranslationHandler 类型
            if (writer.getSerializer() instanceof TranslationHandler serializer) {
                // 如果是，将该属性的空值序列化也交由 TranslationHandler 处理
                writer.assignNullSerializer(serializer);
            }
        }
        // 返回处理后的属性列表
        return beanProperties;
    }

}
